The present examples relate to a computer device, and more particularly, to performing variable sample rate shading in rendering graphics on a computer device.
Computer graphics systems, which can render 2D objects or objects from a 3D world (real or imaginary) onto a two-dimensional (2D) display screen, are currently used in a wide variety of applications. For example, 3D computer graphics can be used for real-time interactive applications, such as video games, virtual reality, scientific research, etc., as well as off-line applications, such as the creation of high resolution movies, graphic art, etc. Typically, the graphics system includes a graphics processing unit (GPU). A GPU may be implemented as a co-processor component to a central processing unit (CPU) of the computer, and may be provided in the form of an add-in card (e.g., video card), co-processor, or as functionality that is integrated directly into the motherboard of the computer or into other devices, such as a gaming device.
Typically, the GPU has a “logical graphics pipeline,” which may accept as input some representation of a 2D or 3D scene and output a bitmap that defines a 2D image for display. For example, the DIRECTX collection of application programming interfaces by MICROSOFT CORPORATION, including the DIRECT3D API, is an example of APIs that have graphic pipeline models. Another example includes the Open Graphics Library (OPENGL) API. The graphics pipeline typically includes a number of stages to convert a group of vertices, textures, buffers, and state information into an image frame on the screen. For instance, one of the stages of the graphics pipeline is a shader. A shader is a piece of code running on a specialized processing unit, also referred to as a shader unit or shader processor, usually executing multiple data threads at once, programmed to generate appropriate levels of color and/or special effects to fragments being rendered. In particular, for example, a vertex shader processes traits (position, texture coordinates, color, etc.) of a vertex, and a pixel shader processes traits (texture values, color, z-depth and alpha value) of a pixel.
In forward rendering, the shaders perform all steps for shading each primitive in the image while rasterizing the primitives to a set of pixels of the final image. Deferred rendering can be employed to delay one or more shading steps or passes typically performed by a pixel shader for each primitive to instead occur after rasterizing the primitives. For example, in deferred rendering, a geometry pass can be performed to generate one or more intermediate render targets, including, for example, position, normal, specular, intensity, etc. Then, additional separate passes can be performed (e.g., lighting, screen space effects such as ambient occlusion, reflections, sub surface scattering, shadow accumulation, etc.) for the pixels in the image based on the one or more intermediate render targets. This approach is typically more efficient, as when shading primitives, the shaded values may subsequently be overwritten by another primitive.
Deferred rendering typically performs the one or more deferred passes for each pixel in the image. Some mechanisms have been proposed to reduce the number of pixels for which deferred rendering is performed to achieve more efficient rendering. For example, some mechanisms include reducing resolution to a lesser number of pixels (and thus a lesser number of pixels to shade in the deferred rendering step), interlaced rendering where alternating lines are rendered in a given screen refresh (thus decreasing the number of pixels that are rendered/shaded to half for the screen refresh), or using a checkerboard rendering pattern where blocks of pixels are rendered or not in a checkboard pattern in a given screen refresh. These are naive solutions that reduce resolution across the screen, which can thereby result in unsatisfactory image quality.